package com.wing.productionPlan.model.response;

import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.wing.productionPlan.model.entity.ProductionPlan;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 排产记录VO
 *
 * @author xiayang
 */
@Data
@NoArgsConstructor
@Accessors(chain = true)
public class ProductionPlanRecordVO {

    /**
     * ID
     */
    private Long id;

    /**
     * 创建时间
     */
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;

    /**
     * 创建者
     */
    private Long creator;

    /**
     * 修改者
     */
    private Long modifier;

    /**
     * 创建人
     */
    private String creatorName;

    /**
     * 修改人
     */
    private String modifierName;

    /**
     * 企业编号
     */
    private String enterpriseCode;

    /**
     * 计划编号
     */
    private String code;

    /**
     * 生产计划ID
     */
    private Long productionPlanId;

    /**
     * 工单编号
     */
    private String workOrderCode;

    /**
     * 产品类型ID
     */
    private Long productTypeId;

    /**
     * 产品类型名称
     */
    private String productTypeName;

    /**
     * 客户SKU料号
     */
    private String customerSkuCode;

    private Integer productionPlanQuantity;

    private Integer productionPlanHaveQuantity;

    /**
     * 客户SKU规格码
     */
    private String customerSkuSpec;

    /**
     * 附件集合
     */
    private List<String> accessoryList;

    /**
     * 附件
     */
    private String accessory;

    /**
     * 单位id
     */
    private Long unitId;

    /**
     * 基准书id
     */
    private Long bookId;

    /**
     * 基准数名字
     */
    private String bookCode;

    /**
     * 单位名称
     */
    private String unitName;

    /**
     * 计划订单类型
     */
    private ProductionPlan.OrderType orderType;

    /**
     * 计划订单类型描述
     */
    private String orderTypeDesc;

    public String getOrderTypeDesc() {
        return orderType == null ? null : orderType.getDesc();
    }

    /**
     * 生产数量
     */
    private Integer productionQuantity;

    /**
     * 排产数量
     */
    private Integer outputQuantity;

    /**
     * 出货时间
     */
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime shipmentTime;

    /**
     * 状态
     */
    private ProductionPlan.Status status;

    /**
     * 状态描述
     */
    private String statusDesc;

    public String getStatusDesc() {
        return status == null ? null : status.getDesc();
    }

    /**
     * 订单id
     */
    private Long orderId;

    /**
     * 客户信息
     */
    private String customerName;

    /**
     * 客户sku名称
     */
    private String customerSkuName;

    /**
     * 计划的排产总数
     */
    private Integer planTotal;

    /**
     * 已完成数
     */
    private Integer finishQuantity;

    /**
     * 需求数
     */
    private Integer demandQuantity;

    /**
     * 计划来源
     */
    private ProductionPlan.PlanSource planSource;

    /**
     * 计划来源描述
     */
    @TableField(exist = false)
    private String planSourceDesc;

    public String getPlanSourceDesc() {
        return planSource == null ? null : planSource.getDesc();
    }

    /**
     * 计划分类id
     */
    private Long planClassifyId;

    /**
     * 是否签约
     */
    private ProductionPlan.SignOrNot signOrNot;

    /**
     * 是否签约描述
     */
    @TableField(exist = false)
    private String signOrNotDesc;

    public String getSignOrNotDesc() {
        return signOrNot == null ? null : signOrNot.getDesc();
    }

    /**
     * 合同ID
     */
    private Long contractId;

    /**
     * 计划类型id
     */
    private Long planTypeId;

    /**
     * 计划类型名称
     */
    private String planTypeName;

    /**
     * 计划性质
     */
    private ProductionPlan.PlanNature planNature;

    /**
     * 计划性质描述
     */
    @TableField(exist = false)
    private String planNatureDesc;

    public String getPlanNatureDesc() {
        return planNature == null ? null : planNature.getDesc();
    }

    /**
     * 审核状态
     */
    private ProductionPlan.CheckStatus checkStatus;

    /**
     * 计划性质描述
     */
    @TableField(exist = false)
    private String checkStatusDesc;

    public String getCheckStatusDesc() {
        return checkStatus == null ? null : checkStatus.getDesc();
    }

    /**
     * 工序id
     */
    private Long processId;
    /**
     * 计划产出时间
     */
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime outputTime;
    /**
     * 审核时间
     */
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime auditTime;

    /**
     * 审核描述
     */
    private String auditRemark;

    /**
     * 审核人
     */
    private String auditPerson;

    /**
     * 创建人电话
     */
    private String phone;

    /**
     * 订单录入人
     */
    private String orderCreatorName;

    /**
     * 订单描述
     */
    private String orderRemark;

    /**
     * 计划描述
     */
    private String remark;

    /**
     * 订单剩余计划量
     */
    private Integer residueQuantity;

    /**
     * 订单编号
     */
    private String orderCode;

    /**
     * 剩余计划量
     */
    private Integer surplusQuantity;

    /**
     * 计划分类
     */
    private String categoryName;

    /**
     * 计划类型
     */
    private String typeName;

    /**
     * 工序名称
     */
    private String processName;

    /**
     * 所属合同
     */
    private String contractName;

    /**
     * 工位名称
     */
    private String workshopName;

    /**
     * 订单提交时间
     */
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime orderCreateTime;

    /**
     * 交货时间
     */
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime deliveryTime;

    /**
     * 是否可以编辑和确认提交 0:可以
     */
    private Integer whetherEdit;

    /**
     * 是否可以继续排产 0:可以
     */
    private Integer whetherProduction;

    /**
     * 订单产品id
     */
    private Long orderProId;

    /**
     * 排产记录编码
     */
    private String productionPlanRecordCode;

    /**
     * 计划生产时间
     */
    private LocalDateTime productTime;

    /**
     * 报工数(末工序)
     */
    private Integer lastReportedQuantity;
}
